<?php

namespace address;

use think\Db;
use think\Log;

class Address
{
    public static $error='';
    /**
     * 地址智能解析
     * @param string 包含丰富信息的字符串
     * @return array 姓名，手机号，邮编，详细地址
     */
    public static function smart_parse($address)
    {
        //解析结果
        $parse = [];
        $parse['name'] = '';
        $parse['mobile'] = '';
        $parse['postcode'] = '';
        $parse['detail'] = '';

        //1. 过滤掉收货地址中的常用说明字符，排除干扰词
        $search = ['地址', '收货地址', '收货人', '收件人', '收货', '邮编', '电话', '备注', '：', ':', '；', ';', '，', ',', '。',];
        $replace = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '];
        $address = str_replace($search, $replace, $address);

        //2. 连续2个或多个空格替换成一个空格
        $address = preg_replace('/ {2,}/', ' ', $address);
        //添加一个,去掉首尾的空格
        $address = trim($address);
        //3. 去除手机号码中的短横线 如136-3333-6666 主要针对苹果手机
        $address = preg_replace('/(\d{3})-(\d{4})-(\d{4})/', '$1$2$3', $address);

        //4. 提取11位手机号码
        preg_match('/\d{11}/', $address, $match);
        if ($match && $match[0]) {
            $parse['mobile'] = $match[0];
            $address = str_replace($match[0], '', $address);
        }

        //5. 提取6位邮编 邮编也可用后面解析出的省市区地址从数据库匹配出
        preg_match('/\d{6}/', $address, $match);
        if ($match && $match[0]) {
            $parse['postcode'] = $match[0];
            $address = str_replace($match[0], '', $address);
        }

        //6.提取实际尺寸和外包尺寸
        preg_match_all('/([0-9]{2})/', $address, $match);
        if ($match && $match[0]) {
            if ($match[0][0] > $match[0][1]) {
                $parse['really'] = $match[0][1];
                $parse['unreally'] = $match[0][0];
            } else {
                $parse['really'] = $match[0][0];
                $parse['unreally'] = $match[0][1];
            }
        }
        //再次把2个及其以上的空格合并成一个，并首位TRIM
        $address = trim(preg_replace('/\s+/', ' ', $address));
        //按照空格切分 长度长的为地址 短的为姓名 因为不是基于自然语言分析，所以采取统计学上高概率的方案

        $split_arr = explode(' ', $address);
        print_r($split_arr);
        //删除尺寸部分(如果有的话)
        if (isset($parse['really']) && isset($parse['unreally'])) {
            foreach ($split_arr as $key=>$value) {
                if (strpos($value, $parse['really']) !==false && strpos($value, $parse['unreally']) !==false ) {
                    $address = str_replace(trim($value), '', $address);
                    unset($split_arr[$key]);
                }
            }
        }
        //获取了手机号,邮编,尺寸后,剩下的就是地址了,如果还有东西,那应该是姓名,不能含有备注.
        if(count($split_arr) == 2){//这是把地址和姓名分开写,地址连在一起
            $parse['name'] = $split_arr[0];
            foreach ($split_arr as $value) {
                if (strlen($value) < strlen($parse['name'])) {
                    $parse['name'] = $value;
                }
            }
            $address = trim(str_replace($parse['name'], '', $address));
        }else if (count($split_arr) > 2){//默认这里都是地址的部分,要把这里的内容连起来
            print_r($split_arr);
            $parse['address'] = $split_arr[0];
            foreach ($split_arr as $key=>$value) {
                if (strlen($value) > strlen($parse['address'])) {
                    $parse['address'] = $value;
                    unset($split_arr[$key]);
                    break;
                }
            }
            dump($split_arr);

            foreach ($split_arr as $key => $value) {
                //??这个语法有问题
                if(Db::name('area')->where(['level'=>1,'name'=>['LIKE','%'.$value.'%']])->find()){
                    if($key<count($split_arr)-1){
                        if(Db::name('area')->where(['level'=>2,'name'=>['LIKE','%'.$split_arr[$key+1].'%']])->find()){
                            $parse['name']=$split_arr[count($split_arr)-1];//姓名是最后一个
                            unset($split_arr[count($split_arr)-1]);
                        }else{
                            $parse['name']=$split_arr[0];//姓名是第一个
                            unset($split_arr[0]);
                        }
                    }else{
                        $parse['name']=$split_arr[0];//姓名是第一个
                        unset($split_arr[0]);
                    }
                }else{
                    $parse['name']=$split_arr[0];//姓名是第一个
                    unset($split_arr[0]);
                }
            }
            foreach (array_reverse($split_arr) as $value){
                $address=trim($value).$address;
            }
        }
        $parse['address']=$address;
        $parse['detail'] = AddressDetail::detail_parse($address);
//        $parse['detail'] = $address;

        //parse['detail']详细地址可以传入另一个文件的函数，解析出：省，市，区，街道地址
        return $parse;
    }

}
